Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

389
Vistas
Eliminar el encabezado "Set-Cookie" duplicado de la respuesta de PHP

Este es un script de ejemplo de una aplicación más grande, pero muestra el proceso general de lo que estoy tratando de hacer. Si tengo el siguiente script:

 <?php ob_start(); setcookie('test1', 'first'); setcookie('test1', 'second'); setcookie('test1', 'third'); setcookie('test2', 'keep'); //TODO remove duplicate test1 from headers ob_end_clean(); die('end test');

Recibo la siguiente respuesta (como se ve a través de Fiddler):

 HTTP/1.1 200 OK Date: Tue, 25 Apr 2017 21:54:45 GMT Server: Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.5.30 X-Powered-By: PHP/5.5.30 Set-Cookie: test1=first Set-Cookie: test1=second Set-Cookie: test1=third Set-Cookie: test2=keep Content-Length: 8 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html end test

El problema es que Set-Cookie: test1 ... existe 3 veces diferentes, por lo tanto, aumenta el tamaño del encabezado innecesariamente. (Nuevamente, este es un ejemplo simplificado; en realidad, estoy tratando con ~ 10 cookies duplicadas en el rango de ~ 800 bytes).

¿Hay algo que pueda escribir en lugar de TODO que elimine el encabezado por completo o que solo se muestre una vez? es decir, el siguiente es mi objetivo final:

 HTTP/1.1 200 OK Date: Tue, 25 Apr 2017 21:54:45 GMT Server: Apache/2.4.17 (Win32) OpenSSL/1.0.2d PHP/5.5.30 X-Powered-By: PHP/5.5.30 Set-Cookie: test1=third Set-Cookie: test2=keep Content-Length: 8 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive Content-Type: text/html end test

aunque Set-Cookie: test1=third tampoco podría existir y eso está bien, pero Set-Cookie: test2=keep debe permanecer. Cuando intento setcookie('test1', '', 1); para eliminar la cookie, agrega un encabezado adicional para marcarla como caducada:

 Set-Cookie: test1=first Set-Cookie: test1=second Set-Cookie: test1=third Set-Cookie: test2=keep Set-Cookie: test1=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

Y si trato de eliminar el encabezado como:

 if (!headers_sent()) { foreach (headers_list() as $header) { if (stripos($header, 'Set-Cookie: test1') !== false) { header_remove('Set-Cookie'); } } }

elimina todos los encabezados Set-Cookie cuando solo quiero que se elimine test1 .

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Como sugirió en ese último bloque de código, la función headers_list() podría usarse para verificar qué encabezados se han enviado. Usando eso, los últimos valores para cada cookie podrían almacenarse en una matriz asociativa. Los nombres y valores se pueden extraer usando explode() (junto con trim() ).

Cuando se han detectado varias cookies con el mismo nombre, podemos usar la llamada header_remove() como lo hizo, pero luego establecer las cookies en los valores finales. Vea el ejemplo a continuación, así como este ejemplo phpfiddle .

 if (!headers_sent()) { $cookiesSet = []; //associative array to store the last value for each cookie $rectifyCookies = false; //multiple values detected for same cookie name foreach (headers_list() as $header) { if (stripos($header, 'Set-Cookie:') !== false) { list($setCookie, $cookieValue) = explode(':', $header); list($cookieName, $cookieValue) = explode('=', trim($cookieValue)); if (array_key_exists($cookieName, $cookiesSet)) { $rectifyCookies = true; } $cookiesSet[$cookieName] = $cookieValue; } } if ($rectifyCookies) { header_remove('Set-Cookie'); foreach($cookiesSet as $cookieName => $cookieValue) { //might need to consider optional 3rd - 8th parameters setcookie($cookieName, $cookieValue); } } }

Producción:

Cache-Control max-age=0, no-cache, no-store, must-revalidate
Mantener viva la conexión
Gzip de codificación de contenido
Tipo de contenido texto/html; conjunto de caracteres = utf-8
Fecha miércoles, 26 de abril de 2017 15:31:33 GMT
Vence el miércoles 11 de enero de 1984 a las 05:00:00 GMT
Pragma sin caché
Servidor nginx
Set-Cookie test1=tercero
test2=mantener
Codificación de transferencia fragmentada
Variar codificación de aceptación

about 4 years ago · Santiago Trujillo Denunciar

0

No entiendo por qué cree que el código de eliminación de cookies que nos mostró eliminaría setcookie para test2.

Si su código está configurando la misma cookie varias veces, entonces debe cambiar su código para que deje de configurar la cookie varias veces. Cualquier otra cosa es una solución descuidada.

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda